package com.solomiao.demo.multi.thread.demo7;

import java.util.concurrent.*;

/**
 * @desc 使用ThreadPoolExecutor创建线程池
 * */
public class MainDemo7 {

    public static void main(String[] args) {
        // 核心线程数
        int corePoolSize = 3;
        // 最大线程数
        int maxPoolSize = 5;
        // 线程空闲时间
        long keepAliveTime = 10;
        TimeUnit timeUnit = TimeUnit.SECONDS;
        // 任务队列容量为10
        // 如下面的例子：
        // 当任务数为13时，最先的3个任务会被核心线程执行，后面的10个任务会被任务队列缓存
        // 当任务数为14时，最先的3个任务会被核心线程执行，后面的10个任务会被任务队列缓存，最后一个任务会再创建一个线程执行，因为此时线程数还没达到最大线程数
        // 如果把最大线程数也设置为3，当任务数为14时，最先的3个任务会被核心线程执行，后面的10个任务会被任务队列缓存，最后一个任务会被拒绝执行从而抛出RejectedExecutionException异常
        BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(10);

        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                corePoolSize,
                maxPoolSize,
                keepAliveTime,
                timeUnit,
                workQueue,
                Executors.defaultThreadFactory(), // 默认线程工厂
                new ThreadPoolExecutor.AbortPolicy() // 拒绝策略：直接抛出异常
        );
        System.out.println("线程池已启动，开始提交任务...");
        try {
            for (int i = 1; i <= 14; i++) {
                threadPool.execute(new ThreadImplementDemo7());
            }
        } catch (Exception e) {
            System.out.println("提交任务出现异常");
            e.printStackTrace();
        }
        System.out.println("任务已提交完毕，等待线程池执行...");
        threadPool.shutdown();
    }


}
